package algorithm_demo.demo_advanced;

/**
 * 等概率事件
 * <p>
 * 利用1到7的随机数，产生一个1到10的随机数
 *
 * @author Api
 * @date 2023/3/27 23:23
 */
public class Code10_EqualProbability {
    /*
     * 底层依赖一个等概率返回a~b的随机函数f
     * 如何加工出等概率返回c~d的随机函数
     */
    public static int g(int a, int b, int c, int d) {
        int range = d - c;//0 ~ range  c ~ d -> 0 ~ d-c
        int num = 1;
        while ((1 << num) - 1 < range) {//求0~range需要几个二进制位
            num++;
        }
        int ans = 0;//最终的累加和，首先+0位上是1还是0,1位上是1还是0,2位上是1还是0...
        do {
            ans = 0;
            for (int i = 0; i < num; i++) {
                ans += (rand01(a, b) << i);
            }
        } while (ans > range);
        return ans + c;
    }

    /*底层依赖一个等概率返回a~b的随机函数f，如何加工出等概率返回0和1的随机函数*/
    public static int rand01(int a, int b) {
        int size = b - a + 1;
        boolean odd = size % 2 != 0;
        int mid = size / 2;
        return 0;
    }
}
